#include "musiclist.h"
#include<QMimeDatabase>
#include<QMimeType>
#include<QDebug>
#include<QSqlQuery>
#include<QSqlError>

/////////////////////////////////////////////////////////////////////////////////
//描述歌曲音乐列表(管理所有的音乐文件),方便组织管理,解析,分离音乐列表中的一个一个音乐文件/////
////////////////////////////////////////////////////////////////////////////////

MusicList::MusicList()
{

}

//通过音乐文件的Url路径为音乐列表添加音乐,添加到QVector<Music> musicList成员变量中
void MusicList::addMusicByUrl(const QList<QUrl> &urls)
{
    for(auto musicUrl:urls)     //根据Url路径创建一个Music对象,并添加到musicList中
    {
        //文件重复过滤,如果该文件已经在musicList中,就不在添加
        //过滤方式:将当前将要添加到musicList中的文件路径,与musicList中已经存在的歌曲文件路径做对比
        //如果相同,则歌曲已经存在,直接跳过,如果不同,还没有添加过.则添加(musicPaths是哈希桶结构存储,查询效率很高)
        QString musicPath=musicUrl.toLocalFile();
        if(musicPaths.contains(musicPath))continue;
        musicPaths.insert(musicPath);

        //根据MIME类型筛选出音乐文件
        //通过QMimeDatabase类型获取文件的MIME类型,当该文件的MIME类型表示是一个有效的歌曲文件,再添加到音乐列表中
        QMimeDatabase database;                                                 //QUrl类通过的toLocalFile()函数将QUrl类型转化成字符串
        QMimeType mimeType = database.mimeTypeForFile(musicUrl.toLocalFile());  //通过QMimeDatabase类提供的mimeTypeForFile()函数获取对应文件的MIME类型
        QString mime=mimeType.name();                                           //通过QMimeType类提供的name()函数获取以字符串方式返回的MIME类型
        //"audio/mpeg"-(MP3)  "audio/flac"-(无损音乐)  "audio/wav"-(WAV)
        if(mime=="audio/mpeg"||mime=="audio/flac"||mime=="audio/wav")
        {
            Music music(musicUrl);                  //根据Url路径创建一个Music对象
            musicList.push_back(music);             //把该对象尾插到musicList(音乐列表)中
        }
    }
}

//提供begin()方法提供musicList的迭代器(该迭代器类型是QVector<Music>类型的迭代器[iterator])
iterator MusicList::begin()
{
    return musicList.begin();
}

//提供end()方法提供musicList的迭代器(该迭代器类型是QVector<Music>类型的迭代器[iterator])
iterator MusicList::end()
{
    return musicList.end();
}

//通过歌曲Id获取对应的迭代器
iterator MusicList::findMusicById(QString musicId)
{
    for(auto it=musicList.begin();it<musicList.end();it++)
    {
        if(musicId==it->getMusicId())return it;
    }
    return musicList.end();
}

//把歌曲列表里的歌曲信息写入数据库
void MusicList::writeToDB()
{
    for(auto music:musicList)
    {
        music.writeMusicToDB();
    }
}

//从数据库中读取歌曲信息写入歌曲列表
void MusicList::readFromDB()
{
    //从数据库中查询所有歌曲信息
    QString sql("select musicId, musicName, musicSinger, albumName, duration, musicUrl, isLike, isHistory from musicInfo");
    QSqlQuery query;
    if(!query.exec(sql))
    {
        qDebug()<<"查询失败"<<query.lastError().text();
        return;
    }
    qDebug()<<"查询成功";
    //查询成功后,按每行读取歌曲信息并存储到music对象中,再根据music对象更新musicList和musicPaths
    while(query.next())
    {
        //创建一个music对象
        Music music;
        //把从数据库里读取的数据设置到music对象里面
        music.setMusicId(query.value(0).toString());
        music.setMusicName(query.value(1).toString());
        music.setMusicSinger(query.value(2).toString());
        music.setMusicAlbum(query.value(3).toString());
        music.setDuration(query.value(4).toLongLong());
        music.setMusicUrl("file:///"+query.value(5).toString());    //"file:///"用于表示url的类型,为本地文件的类型
        music.setIsLike(query.value(6).toBool());
        music.setIsHistory(query.value(7).toBool());
        //尾插music对象到musicList列表中
        musicList.push_back(music);
        //更新musicPaths列表-->防止相同母录下的歌曲重复加载
        musicPaths.insert(music.getMusicUrl().toLocalFile());
    }
}


